OpenSearchをローカル環境でDockerを利用して構築する
現在、自分はProfllyというプロフィールビューアーサービスの開発を行っています。
Profllyでは、サービス内の検索エンジンとしてAmazon OpenSearch Service(旧Amazon Elasticsearch Service)を採用しています。
システムを構築するにあたっては、マネージドサービスであるOpenSearch Serviceを利用していますが、開発環境ではコストを抑えるために個人のローカル環境に構築したOpenSearchを利用したい、というニーズがありました。
上記ニーズを満たすため、Dockerを利用しつつローカル環境にOpenSearchを構築してみたので、その手順をご紹介します。
OpenSearchについて
OpenSearchは、Apache2.0ライセンス(ALv2)のElasticsearch7.10.2およびKibana7.10.2から派生したコミュニティ主導の分散型オープンソース検索および分析スイートです。
検索エンジンデーモンのOpenSearchと、統合された視覚化ツールであるOpenSearch Dashboardsで構成されています。
他、OpenSearchの詳細については以下が参考になります。
検証環境
- OpenSearch
1.0.1
- OpenSearch Dashboards
1.0.1
- Docker
20.10.8
- Docker Compose
1.29.2
OpenSearch + OpenSearch DashboardsをDockerを使って構築する
今回は、ローカル環境においてDockerを利用しつつOpenSearch + OpenSearch Dashboardsを構築してみます。
以下のドキュメントを参考にしながら、OpenSearchをDockerで起動するためのComposeファイルを定義していきます。
version: '3' services: opensearch-dashboards: image: opensearchproject/opensearch-dashboards:1.0.1 container_name: opensearch-dashboards environment: OPENSEARCH_HOSTS: "https://opensearch:9200" ports: - 5601:5601 links: - opensearch networks: - sandbox opensearch: build: context: . dockerfile: Dockerfile container_name: opensearch environment: - cluster.name=docker-cluster - node.name=os-node - cluster.initial_master_nodes=os-node - bootstrap.memory_lock=true - http.host=0.0.0.0 - transport.host=127.0.0.1 - "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m" ulimits: memlock: soft: -1 hard: -1 volumes: - $PWD/.local/opensearch:/usr/share/opensearch/data ports: - 9200:9200 networks: - sandbox networks: sandbox:
FROM opensearchproject/opensearch:1.0.1 RUN /usr/share/opensearch/bin/opensearch-plugin install https://artifacts.opensearch.org/releases/plugins/analysis-kuromoji/1.0.0/analysis-kuromoji-1.0.0.zip RUN /usr/share/opensearch/bin/opensearch-plugin install https://artifacts.opensearch.org/releases/plugins/analysis-icu/1.0.0/analysis-icu-1.0.0.zip
Dockerfile
では、今回のシステムで必要となる2つのプラグインをインストールしています。
analysis-kuromoji
analysis-icu
但し、OpenSearch 1.0.1
の時点では、プラグイン名を指定してインストールを実行するとインストールに失敗する問題があるため、ワークアラウンドとして直接プラグインのzip URLを指定する形にしています。
(この問題は、今後リリースが予定されているOpenSearch 1.1
にて解消される予定とのこと)
【2021/10/11 追記】
2021/10/5にリリースされたv1.1.0では、上記のような問題は解消されていました。v1.1.0以降であれば、プラグインは以下のような記述でインストールできるかと思います。
FROM opensearchproject/opensearch:1.1.0 RUN /usr/share/opensearch/bin/opensearch-plugin install analysis-kuromoji RUN /usr/share/opensearch/bin/opensearch-plugin install analysis-icu
Composeファイルが準備できたので、コンテナを起動してみます。
$ docker-compose up -d
ローカルで構築したOpenSearchにアクセスしてみる
コンテナが起動できたら、ドキュメントを参考にcurlを叩いてローカルのOpenSearchにアクセスしてみます。
$ curl -XGET https://localhost:9200 -u 'admin:admin' --insecure
{ "name" : "os-node", "cluster_name" : "docker-cluster", "cluster_uuid" : "5wu-pBlIQb-64niPP_zY0A", "version" : { "distribution" : "opensearch", "number" : "1.0.0", "build_type" : "tar", "build_hash" : "34550c5b17124ddc59458ef774f6b43a086522e3", "build_date" : "2021-07-02T23:22:21.383695Z", "build_snapshot" : false, "lucene_version" : "8.8.2", "minimum_wire_compatibility_version" : "6.8.0", "minimum_index_compatibility_version" : "6.0.0-beta1" }, "tagline" : "The OpenSearch Project: https://opensearch.org/" }
無事にOpenSearchが立ち上がっていますね。
次に、OpenSearch Dashboards(Elasticsearchで言うところのKibana)にアクセスしてみます。
http://localhost:5601/
デフォルトではセキュリティプラグインが有効化されているので、ログイン画面が表示されます。
初期IDとパスワードはいずれもadmin
となります。
(なお、OpenSearchおよびDashboardsのセキュリティプラグインを無効化したい場合は、こちらのドキュメントを参考にして設定を変更してみてください)
続いて、テナント選択の画面が表示されるのでひとまずキャンセルします。
無事にOpenSearch Dashboardsのホーム画面が表示されました。
せっかくなので、デフォルトで用意されているサンプルデータを投入してみます。 「Add sample data」をクリックします。
今回は、Sample web logs
を使ってみます。「Add data」をクリックするとデータ投入が開始されるので、しばらく待ちます。
データ投入が完了したら、以下からDev Toolsにアクセスしてみます。
http://localhost:5601/app/dev_tools#/console
以下のようなコマンドを叩いて、先程突っ込んだサンプルデータの件数を確認してみます。
GET opensearch_dashboards_sample_data_logs/_count
{ "count" : 14074, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 } }
サンプルデータが存在することを確認できました。
おわりに
Dockerを利用してローカル環境にてOpenSearchを構築してみました。
システムでAmazon OpenSearch Serviceを利用している場合、開発環境ではローカル環境に構築したOpenSearchを利用することで、コストの抑制や柔軟な検証が実現できるのではないかと思います。
どなたかの参考になれば幸いです。